/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia.JPAControllers;

import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import Logica.Core.Depositos.Deposito;
import Logica.Core.Depositos.LoteLeña;
import Logica.Core.Producto.Producto;
import Persistencia.JPAControllers.exceptions.NonexistentEntityException;
import Persistencia.JPAControllers.exceptions.PreexistingEntityException;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 *
 * @author DANIEL
 */
public class LoteLeñaJpaController implements Serializable {

    public LoteLeñaJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public LoteLeñaJpaController() {
        emf = Persistence.createEntityManagerFactory("SecaderoPU");
    }

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(LoteLeña loteLeña) throws PreexistingEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Deposito miDeposito = loteLeña.getMiDeposito();
            if (miDeposito != null) {
                miDeposito = em.getReference(miDeposito.getClass(), miDeposito.getId());
                loteLeña.setMiDeposito(miDeposito);
            }
            Producto miProducto = loteLeña.getMiProducto();
            if (miProducto != null) {
                miProducto = em.getReference(miProducto.getClass(), miProducto.getId());
                loteLeña.setMiProducto(miProducto);
            }
            em.persist(loteLeña);
            if (miDeposito != null) {
                miDeposito.getMisLotes().add(loteLeña);
                miDeposito = em.merge(miDeposito);
            }
            if (miProducto != null) {
                Logica.Core.Depositos.Lote oldMiLoteOfMiProducto = miProducto.getMiLote();
                if (oldMiLoteOfMiProducto != null) {
                    oldMiLoteOfMiProducto.setMiProducto(null);
                    oldMiLoteOfMiProducto = em.merge(oldMiLoteOfMiProducto);
                }
                miProducto.setMiLote(loteLeña);
                miProducto = em.merge(miProducto);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findLoteLeña(loteLeña.getNumero()) != null) {
                throw new PreexistingEntityException("LoteLe\u00f1a " + loteLeña + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(LoteLeña loteLeña) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            LoteLeña persistentLoteLeña = em.find(LoteLeña.class, loteLeña.getNumero());
            Deposito miDepositoOld = persistentLoteLeña.getMiDeposito();
            Deposito miDepositoNew = loteLeña.getMiDeposito();
            Producto miProductoOld = persistentLoteLeña.getMiProducto();
            Producto miProductoNew = loteLeña.getMiProducto();
            if (miDepositoNew != null) {
                miDepositoNew = em.getReference(miDepositoNew.getClass(), miDepositoNew.getId());
                loteLeña.setMiDeposito(miDepositoNew);
            }
            if (miProductoNew != null) {
                miProductoNew = em.getReference(miProductoNew.getClass(), miProductoNew.getId());
                loteLeña.setMiProducto(miProductoNew);
            }
            loteLeña = em.merge(loteLeña);
            if (miDepositoOld != null && !miDepositoOld.equals(miDepositoNew)) {
                miDepositoOld.getMisLotes().remove(loteLeña);
                miDepositoOld = em.merge(miDepositoOld);
            }
            if (miDepositoNew != null && !miDepositoNew.equals(miDepositoOld)) {
                miDepositoNew.getMisLotes().add(loteLeña);
                miDepositoNew = em.merge(miDepositoNew);
            }
            if (miProductoOld != null && !miProductoOld.equals(miProductoNew)) {
                miProductoOld.setMiLote(null);
                miProductoOld = em.merge(miProductoOld);
            }
            if (miProductoNew != null && !miProductoNew.equals(miProductoOld)) {
                Logica.Core.Depositos.Lote oldMiLoteOfMiProducto = miProductoNew.getMiLote();
                if (oldMiLoteOfMiProducto != null) {
                    oldMiLoteOfMiProducto.setMiProducto(null);
                    oldMiLoteOfMiProducto = em.merge(oldMiLoteOfMiProducto);
                }
                miProductoNew.setMiLote(loteLeña);
                miProductoNew = em.merge(miProductoNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                int id = loteLeña.getNumero();
                if (findLoteLeña(id) == null) {
                    throw new NonexistentEntityException("The loteLe\u00f1a with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(int id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            LoteLeña loteLeña;
            try {
                loteLeña = em.getReference(LoteLeña.class, id);
                loteLeña.getNumero();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The loteLe\u00f1a with id " + id + " no longer exists.", enfe);
            }
            Deposito miDeposito = loteLeña.getMiDeposito();
            if (miDeposito != null) {
                miDeposito.getMisLotes().remove(loteLeña);
                miDeposito = em.merge(miDeposito);
            }
            Producto miProducto = loteLeña.getMiProducto();
            if (miProducto != null) {
                miProducto.setMiLote(null);
                miProducto = em.merge(miProducto);
            }
            em.remove(loteLeña);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<LoteLeña> findLoteLeñaEntities() {
        return findLoteLeñaEntities(true, -1, -1);
    }

    public List<LoteLeña> findLoteLeñaEntities(int maxResults, int firstResult) {
        return findLoteLeñaEntities(false, maxResults, firstResult);
    }

    private List<LoteLeña> findLoteLeñaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from LoteLe\u00f1a as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public LoteLeña findLoteLeña(int id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(LoteLeña.class, id);
        } finally {
            em.close();
        }
    }

    public int getLoteLeñaCount() {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select count(o) from LoteLe\u00f1a as o");
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
}
